package com.yystudy.aiagentbackend.rag;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;
import org.springframework.ai.rag.retrieval.search.DocumentRetriever;
import org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.filter.Filter;
import org.springframework.ai.vectorstore.filter.FilterExpressionBuilder;


/**
 * 根据用户需求生成对应的 Advisor（工厂类）
 */
@Slf4j
public class LoveAppRagCustomAdvisorFactory {

    /**
     * 在向量数据库中查找时先根据元信息中的 status 过滤出符合要求的document，再进行下一步
     * @param vectorStore   向量数据库
     * @param status  元信息中存储的数据
     * @return  检索增强顾问
     */
    public static Advisor createLoveAppRagCustomAdvisor(VectorStore vectorStore, String status) {
        Filter.Expression expression = new FilterExpressionBuilder()
                .eq("status", status)
                .build();
        DocumentRetriever documentRetriever = VectorStoreDocumentRetriever.builder()
                .vectorStore(vectorStore)
                .filterExpression(expression) // 过滤条件
                .similarityThreshold(0.5) // 相似度阈值
                .topK(3) // 返回文档数量
                .build();
        // 注意 RetrievalAugmentationAdvisor 有默认的查询增强器
        /*
            默认的逻辑为如果没有找到相关文档的话就会将用户的 prompt 重写为：
            The user query is outside your knowledge base.
            Politely inform the user that you can't answer it.
         */
        return RetrievalAugmentationAdvisor.builder()
                .documentRetriever(documentRetriever)
                .queryAugmenter(LoveAppContextualQueryAugmenterFactory.createInstance())
                .build();
    }
}